package com.Poly_detail;
//这里是java中动态绑定机制的示范代码
public class Test {
    public static void main(String[] args) {
        A a = new B();//向上转型
        //这里是编译类型是A，运行类型是B
        //所以这里的a.sum()执行的是B中的sum方法，因为运行过程中主要以运行类型为主
        //1.查看B中是否有sum方法，有的话运行B中sum方法。
        // 2.又因有getI方法，又用到getI方法。
        // 3.属性是看编译类型，即B中的count = 20，返回给getI，再返回给sum
        //4.确定答案就是40
        System.out.println(a.sum());//40->30
        //此处再看B中是否有sum1方法，结果是有的，同上分析，可得是30
        System.out.println(a.sum1());//30->20
        //那么现在我将B中sum方法注释掉，又会发生什么呢？
        //进行分析：
        // 1.此处B中没有查找到sum方法，就往父类A中寻找。
        //2.父类A中有sum方法，则执行A中的sum方法，执行流程同上，结果会变成30
        //这里我有将sum1方法注释掉，进行分析:
        //1.B类没有sum1方法，此处寻找A中的sum1，这里就有疑问了，我们这里的i是取B中的呢？还是A中的？
        //根据java的相关规则，在调用属性时，没有动态绑定，哪里声明，哪里使用
        //即根据一样的流程，会分析出i=10，通过返回到getI中，在sum1中计算，结果又变成了20
    }
}
//这里进行总结：
//Java的动态绑定机制（非常非常重要）：
//1.当调用对象方法的时候，该方法会和该对象内存地址/运行类型绑定
//2.当调用对象属性时，没有动态绑定机制，哪里声明，哪里使用

